#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#define RST_PIN PD2 // Reset pin -- AD9850 <----> AtMega328
#define DATA_PIN PD3 // Data pin -- AD9850 <----> AtMega328
#define FU_UD_PIN PD4 // Freq_up pin -- AD9850 <----> AtMega328
#define W_CLK_PIN PD5 // Word Clock pin -- AD9850 <----> AtMega328
#define OA1_OUT PC0 // OpAmp 1 Output read
#define OA2_OUT PC1 // OpAmp 2 Output read
void pulse_high(uint8_t pin){
PORTD |= _BV(pin);
PORTD &= ~_BV(pin);
}
void send_byte(uint8_t byte){
for(uint8_t i = 0; i < 8; i++, byte >>= 1){
if( !(byte & 0x01) )
PORTD &= ~_BV(DATA_PIN);
else
PORTD |= _BV(DATA_PIN);
pulse_high(W_CLK_PIN);
}
}
void freq_send(uint64_t frequency){
uint32_t freq = (frequency * 4294967296) / (uint64_t)125E6;
for(uint8_t j = 0; j < 4; j++, freq >>= 8){
send_byte(freq & 0xff);
}
send_byte(0x0000);
pulse_high(FU_UD_PIN);
}
void mega328_setup(void){
DDRD = 0xff; // Define Port D as output
DDRC &= ~_BV(OA1_OUT); // Define Port C pin PC0 as input, used to read OpAmp1 output
DDRC &= ~_BV(OA2_OUT); // Define Port C pin PC1 as input, used to read OpAmp2 output
}
void ad9850_setup(void){
pulse_high(RST_PIN);
pulse_high(W_CLK_PIN);
pulse_high(FU_UD_PIN);
}
int main(void){
mega328_setup();
ad9850_setup();
for( ; ; ){
freq_send(2e6);
_delay_ms(60000);
freq_send(5e6);
_delay_ms(60000);
freq_send(10e6);
_delay_ms(60000);
freq_send(39e6);
_delay_ms(60000);
}
return 0;
}
I2luY2x1ZGUgPGF2ci9pby5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KI2luY2x1ZGUgPHV0aWwvZGVsYXkuaD4KCiNkZWZpbmUgUlNUX1BJTiAgIFBEMiAvLyBSZXNldCBwaW4gICAgICAtLSBBRDk4NTAgPC0tLS0+IEF0TWVnYTMyOAojZGVmaW5lIERBVEFfUElOICBQRDMgLy8gRGF0YSBwaW4gICAgICAgLS0gQUQ5ODUwIDwtLS0tPiBBdE1lZ2EzMjgKI2RlZmluZSBGVV9VRF9QSU4gUEQ0IC8vIEZyZXFfdXAgcGluICAgIC0tIEFEOTg1MCA8LS0tLT4gQXRNZWdhMzI4CiNkZWZpbmUgV19DTEtfUElOIFBENSAvLyBXb3JkIENsb2NrIHBpbiAtLSBBRDk4NTAgPC0tLS0+IEF0TWVnYTMyOAojZGVmaW5lIE9BMV9PVVQgICBQQzAgLy8gT3BBbXAgMSBPdXRwdXQgcmVhZAojZGVmaW5lIE9BMl9PVVQgICBQQzEgLy8gT3BBbXAgMiBPdXRwdXQgcmVhZAoKdm9pZCBwdWxzZV9oaWdoKHVpbnQ4X3QgcGluKXsKICAgUE9SVEQgfD0gX0JWKHBpbik7CiAgIFBPUlREICY9IH5fQlYocGluKTsKfQoKdm9pZCBzZW5kX2J5dGUodWludDhfdCBieXRlKXsKICAgZm9yKHVpbnQ4X3QgaSA9IDA7IGkgPCA4OyBpKyssIGJ5dGUgPj49IDEpewogICAgICBpZiggIShieXRlICYgMHgwMSkgKQogICAgICAgICBQT1JURCAmPSB+X0JWKERBVEFfUElOKTsKICAgICAgZWxzZQogICAgICAgICBQT1JURCB8PSBfQlYoREFUQV9QSU4pOwogICAgICBwdWxzZV9oaWdoKFdfQ0xLX1BJTik7CiAgIH0KfQoKdm9pZCBmcmVxX3NlbmQodWludDY0X3QgZnJlcXVlbmN5KXsKICAgdWludDMyX3QgZnJlcSA9IChmcmVxdWVuY3kgKiA0Mjk0OTY3Mjk2KSAvICh1aW50NjRfdCkxMjVFNjsKICAgZm9yKHVpbnQ4X3QgaiA9IDA7IGogPCA0OyBqKyssIGZyZXEgPj49IDgpewogICAgICBzZW5kX2J5dGUoZnJlcSAmIDB4ZmYpOwogICB9CiAgIHNlbmRfYnl0ZSgweDAwMDApOwogICBwdWxzZV9oaWdoKEZVX1VEX1BJTik7Cn0KCnZvaWQgbWVnYTMyOF9zZXR1cCh2b2lkKXsKICAgRERSRCA9IDB4ZmY7IC8vIERlZmluZSBQb3J0IEQgYXMgb3V0cHV0CiAgIEREUkMgJj0gfl9CVihPQTFfT1VUKTsgLy8gRGVmaW5lIFBvcnQgQyBwaW4gUEMwIGFzIGlucHV0LCB1c2VkIHRvIHJlYWQgT3BBbXAxIG91dHB1dAogICBERFJDICY9IH5fQlYoT0EyX09VVCk7IC8vIERlZmluZSBQb3J0IEMgcGluIFBDMSBhcyBpbnB1dCwgdXNlZCB0byByZWFkIE9wQW1wMiBvdXRwdXQKfQoKdm9pZCBhZDk4NTBfc2V0dXAodm9pZCl7CiAgIHB1bHNlX2hpZ2goUlNUX1BJTik7CiAgIHB1bHNlX2hpZ2goV19DTEtfUElOKTsKICAgcHVsc2VfaGlnaChGVV9VRF9QSU4pOwp9CgppbnQgbWFpbih2b2lkKXsKICAgbWVnYTMyOF9zZXR1cCgpOwogICBhZDk4NTBfc2V0dXAoKTsKICAgZm9yKCA7IDsgKXsKICAgICAgZnJlcV9zZW5kKDJlNik7CiAgICAgIF9kZWxheV9tcyg2MDAwMCk7CiAgICAgIGZyZXFfc2VuZCg1ZTYpOwogICAgICBfZGVsYXlfbXMoNjAwMDApOwogICAgICBmcmVxX3NlbmQoMTBlNik7CiAgICAgIF9kZWxheV9tcyg2MDAwMCk7CiAgICAgIGZyZXFfc2VuZCgzOWU2KTsKICAgICAgX2RlbGF5X21zKDYwMDAwKTsKICAgfQogICByZXR1cm4gMDsKfQo=